package com.orion.pool;

import com.orion.SmallTool;

import java.util.Random;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 线程池的拒绝策略
 * <p>
 * 重写自定义的任务拒绝策略，可以从结果中看出，线程池处理不过来，对于多出的任务直接丢弃掉
 * <p>
 * 线程池能处理的最大任务数是queueSize + maxPoolSize
 *
 * CallerRunsPolicy:使用此策略，如果添加到线程池失败，那么主线程会自己去执行该任务，不会等待线程池中的线程去执行。
 * 就像是个急脾气的人，我等不到别人来做这件事就干脆自己干
 *
 *
 * @author Administrator
 */
public class ThreadPoolRejectCallerRunsPolicy {

    private static ThreadPoolExecutor the = new ThreadPoolExecutor(3, 5, 10
            , TimeUnit.SECONDS, new LinkedBlockingQueue<>(5), new CustomThreadFactory()
            ,new ThreadPoolExecutor.CallerRunsPolicy()
            //, (r, executor) -> SmallTool.printTimeAndThread(" 正在放弃任务：" + r + " , 所属executor : " + executor)
    );

    public static void main(String[] args) {
        Runnable r = () -> {
            int sleepSec = new Random().nextInt(5) + 1;
            SmallTool.printTimeAndThread("睡眠秒数：" + sleepSec);
            SmallTool.sleepMillis(sleepSec * 1000);
        };


        for (int i = 0; i < 100; i++) {
            the.execute(r);
        }

        the.shutdown();

    }

    static class CustomThreadFactory implements ThreadFactory {

        private AtomicInteger atomicInteger = new AtomicInteger(0);

        private ThreadGroup group = new ThreadGroup("llc-group");

        private String prefix = "llc-thread-pool-";

        @Override
        public Thread newThread(Runnable r) {
            return new Thread(group, r, prefix + atomicInteger.incrementAndGet());
        }
    }
}
/**
 * 运行结果：
 1647680319785	|	12	|	llc-thread-pool-2	|	睡眠秒数：4
 1647680319786	|	13	|	llc-thread-pool-3	|	睡眠秒数：4
 1647680319786	|	1	|	main	|	睡眠秒数：1
 1647680319786	|	11	|	llc-thread-pool-1	|	睡眠秒数：5
 1647680319786	|	14	|	llc-thread-pool-4	|	睡眠秒数：4
 1647680319786	|	15	|	llc-thread-pool-5	|	睡眠秒数：1
 1647680320794	|	15	|	llc-thread-pool-5	|	睡眠秒数：1
 1647680320794	|	1	|	main	|	睡眠秒数：3
 1647680321821	|	15	|	llc-thread-pool-5	|	睡眠秒数：4
 1647680323791	|	13	|	llc-thread-pool-3	|	睡眠秒数：2
 1647680323792	|	14	|	llc-thread-pool-4	|	睡眠秒数：1
 1647680323792	|	12	|	llc-thread-pool-2	|	睡眠秒数：4
 1647680323808	|	1	|	main	|	睡眠秒数：3
 1647680324786	|	11	|	llc-thread-pool-1	|	睡眠秒数：1
 1647680324803	|	14	|	llc-thread-pool-4	|	睡眠秒数：5
 1647680325790	|	11	|	llc-thread-pool-1	|	睡眠秒数：3
 1647680325806	|	13	|	llc-thread-pool-3	|	睡眠秒数：3
 1647680325822	|	15	|	llc-thread-pool-5	|	睡眠秒数：2
 1647680326816	|	1	|	main	|	睡眠秒数：3
 1647680327799	|	12	|	llc-thread-pool-2	|	睡眠秒数：1
 1647680327838	|	15	|	llc-thread-pool-5	|	睡眠秒数：3
 1647680328799	|	11	|	llc-thread-pool-1	|	睡眠秒数：1
 1647680328816	|	13	|	llc-thread-pool-3	|	睡眠秒数：2
 1647680328816	|	12	|	llc-thread-pool-2	|	睡眠秒数：2
 1647680329824	|	14	|	llc-thread-pool-4	|	睡眠秒数：4
 1647680329824	|	11	|	llc-thread-pool-1	|	睡眠秒数：4
 1647680329824	|	1	|	main	|	睡眠秒数：1
 1647680330832	|	12	|	llc-thread-pool-2	|	睡眠秒数：5
 1647680330832	|	13	|	llc-thread-pool-3	|	睡眠秒数：1
 1647680330833	|	1	|	main	|	睡眠秒数：4
 1647680330847	|	15	|	llc-thread-pool-5	|	睡眠秒数：3
 1647680331841	|	13	|	llc-thread-pool-3	|	睡眠秒数：4
 1647680333827	|	11	|	llc-thread-pool-1	|	睡眠秒数：3
 1647680333827	|	14	|	llc-thread-pool-4	|	睡眠秒数：1
 1647680333858	|	15	|	llc-thread-pool-5	|	睡眠秒数：2
 1647680334833	|	1	|	main	|	睡眠秒数：4
 1647680334834	|	14	|	llc-thread-pool-4	|	睡眠秒数：4
 1647680335846	|	12	|	llc-thread-pool-2	|	睡眠秒数：3
 1647680335846	|	13	|	llc-thread-pool-3	|	睡眠秒数：5
 1647680335863	|	15	|	llc-thread-pool-5	|	睡眠秒数：5
 1647680336839	|	11	|	llc-thread-pool-1	|	睡眠秒数：5
 1647680338840	|	1	|	main	|	睡眠秒数：1
 1647680338840	|	14	|	llc-thread-pool-4	|	睡眠秒数：2
 1647680338854	|	12	|	llc-thread-pool-2	|	睡眠秒数：5
 1647680339845	|	1	|	main	|	睡眠秒数：4
 1647680340847	|	14	|	llc-thread-pool-4	|	睡眠秒数：2
 1647680340863	|	13	|	llc-thread-pool-3	|	睡眠秒数：3
 1647680340864	|	15	|	llc-thread-pool-5	|	睡眠秒数：4
 1647680341847	|	11	|	llc-thread-pool-1	|	睡眠秒数：4
 1647680342847	|	14	|	llc-thread-pool-4	|	睡眠秒数：4
 1647680343859	|	1	|	main	|	睡眠秒数：1
 1647680343859	|	12	|	llc-thread-pool-2	|	睡眠秒数：2
 1647680343875	|	13	|	llc-thread-pool-3	|	睡眠秒数：2
 1647680344859	|	1	|	main	|	睡眠秒数：3
 1647680344875	|	15	|	llc-thread-pool-5	|	睡眠秒数：4
 1647680345849	|	11	|	llc-thread-pool-1	|	睡眠秒数：1
 1647680345865	|	12	|	llc-thread-pool-2	|	睡眠秒数：1
 1647680345881	|	13	|	llc-thread-pool-3	|	睡眠秒数：2
 1647680346857	|	11	|	llc-thread-pool-1	|	睡眠秒数：2
 1647680347864	|	14	|	llc-thread-pool-4	|	睡眠秒数：2
 1647680347865	|	12	|	llc-thread-pool-2	|	睡眠秒数：2
 1647680347866	|	1	|	main	|	睡眠秒数：5
 1647680347896	|	13	|	llc-thread-pool-3	|	睡眠秒数：5
 1647680348857	|	11	|	llc-thread-pool-1	|	睡眠秒数：5
 1647680348889	|	15	|	llc-thread-pool-5	|	睡眠秒数：4
 1647680349871	|	12	|	llc-thread-pool-2	|	睡眠秒数：4
 1647680349871	|	14	|	llc-thread-pool-4	|	睡眠秒数：3
 1647680352867	|	1	|	main	|	睡眠秒数：2
 1647680352883	|	14	|	llc-thread-pool-4	|	睡眠秒数：1
 1647680352898	|	13	|	llc-thread-pool-3	|	睡眠秒数：2
 1647680352898	|	15	|	llc-thread-pool-5	|	睡眠秒数：5
 1647680353862	|	11	|	llc-thread-pool-1	|	睡眠秒数：3
 1647680353878	|	12	|	llc-thread-pool-2	|	睡眠秒数：5
 1647680354882	|	1	|	main	|	睡眠秒数：3
 1647680354882	|	14	|	llc-thread-pool-4	|	睡眠秒数：1
 1647680354912	|	13	|	llc-thread-pool-3	|	睡眠秒数：4
 1647680355887	|	14	|	llc-thread-pool-4	|	睡眠秒数：3
 1647680356867	|	11	|	llc-thread-pool-1	|	睡眠秒数：5
 1647680357893	|	1	|	main	|	睡眠秒数：4
 1647680357908	|	15	|	llc-thread-pool-5	|	睡眠秒数：2
 1647680358887	|	12	|	llc-thread-pool-2	|	睡眠秒数：1
 1647680358903	|	14	|	llc-thread-pool-4	|	睡眠秒数：1
 1647680358919	|	13	|	llc-thread-pool-3	|	睡眠秒数：4
 1647680359903	|	12	|	llc-thread-pool-2	|	睡眠秒数：2
 1647680361902	|	14	|	llc-thread-pool-4	|	睡眠秒数：5
 1647680361903	|	15	|	llc-thread-pool-5	|	睡眠秒数：1
 1647680361903	|	11	|	llc-thread-pool-1	|	睡眠秒数：5
 1647680361905	|	1	|	main	|	睡眠秒数：2
 1647680361920	|	12	|	llc-thread-pool-2	|	睡眠秒数：4
 1647680362910	|	15	|	llc-thread-pool-5	|	睡眠秒数：1
 1647680362926	|	13	|	llc-thread-pool-3	|	睡眠秒数：2
 1647680363915	|	15	|	llc-thread-pool-5	|	睡眠秒数：2
 1647680363915	|	1	|	main	|	睡眠秒数：3
 1647680364941	|	13	|	llc-thread-pool-3	|	睡眠秒数：2
 1647680365919	|	15	|	llc-thread-pool-5	|	睡眠秒数：5
 1647680365935	|	12	|	llc-thread-pool-2	|	睡眠秒数：4
 1647680366911	|	11	|	llc-thread-pool-1	|	睡眠秒数：4
 1647680366911	|	14	|	llc-thread-pool-4	|	睡眠秒数：3
 1647680366943	|	13	|	llc-thread-pool-3	|	睡眠秒数：3
 1647680369919	|	14	|	llc-thread-pool-4	|	睡眠秒数：3
 */
